{
    /**
     * 泛型别名（泛型类型别名）
     * 语法 大多数情况泛型就是在 在名字后面加上<>语法 尖括号里面可以定义类型变量(类比形参)
     * 通常一个参数的话，大家都喜欢起T 因为T的意思就是Type
     * 重要 泛型本质就是 类型传参
     * 
     * js 里面 传参 ()
     * ts 类型传参 <> 里面的类型参数也可以提供默认值
     */
    type Obj<A = number, B = string> = {
        a: A,
        b: B
    }
    const obj1: Obj = {
        a: 1,
        b: '2'
    }
    obj1
    const obj2: Obj<boolean, null> = {
        a: true,
        b: null
    }
    obj2
    const obj3: Obj<undefined, Array<number>> = {
        a: undefined,
        b: [1,2,3]
    }
    obj3

    /**
     * 请求后端接口 后端有自己的规范，比如接口都会返回code和message
     * {
     *  code: xxx
     *  message: '',
     *  data: yyy // 请求用户数据 返回的是用户数据 请求文章的数据 返回的是文章数据
     * }
     */

    type User = {
        name: string
        age: number
    }
    type Article = {
        id: number,
        content: string
    }
    type ApiResData<T> = {
        code: number,
        message: string,
        data: T
    }

    type UserData = ApiResData<User>
    type ArticleData = ApiResData<Article>

    // 像类似接口返回的类型这种场景 都是用泛型处理
    // type CodeAndMessage = {
    //     code: number
    //     message: string
    // }

    // type XXXData = CodeAndMessage & {
        
    // }

    const userData: UserData = {
        code: 100,
        message: '获取用户信息成功',
        data: {
            name: 'zs',
            age: 18
        }
    }
    userData

    const articleData: ArticleData = {
        code: 100,
        message: '获取文章成功',
        data: {
            id: 1,
            content: '123'
        }
    }
    articleData
}


export { }
